package com.itheima.domain;

import com.itheima.utils.SqlSessionUtils2;
import com.itheima.utils.SqlSessionUtils3;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;
import java.util.Date;
import java.util.List;


/*
* 使用普通工具类简化操作
*
* */
public class MybatisTest3 {

    /*
    * 查询全部学生信息
    * */
    @Test
    public  void findAll() throws IOException {
        SqlSession sqlSession =null;
        try{
            sqlSession = SqlSessionUtils3.openSession();
            List<Student> students = sqlSession.selectList("xx.findAll");
            for (Student stu : students) {
                System.out.println(stu);
            }
            //查询不需要提交
        }catch(Exception e){
            //查询操作不需要回滚
        }finally{
            SqlSessionUtils3.close();
        }

/*
        //读取核心配置文件（内部会同步解析映射文件）
//        InputStream is = Test.class.getClassLoader().getResourceAsStream("mybatis.xml");
        //框架内简化了这一步的操作
        InputStream is = Resources.getResourceAsStream("mybatis.xml");
        //获取工厂对象
        //构建者设计模式，封装复杂对象的构建过程，让使用者可以跟家方便简介的获取到需要的目标对象
        //***这个对象最好在方法的局部位置，这个方法一旦执行结束，这个对象就不再需要了
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //获取sqlSession对象(本质是封装Connection对象)
        //***SqlsessionFactory要保证整个应用中唯一不要重复创建，可以通过单例设计模式或静态成员方式的方式保证
        //***SqlSession不能实现线程共享的，每次使用，都要单独获取，使用完之后，一定记得调用close方法，实现归还
        SqlSession sqlSession = factory.openSession();
        //执行查询操作
        List<Student> list = sqlSession.selectList("xx.findAll");
        System.out.println(list);
        //释放资源本质是归还Connection对象
        sqlSession.close();*/
    }

    /*
    * 根据条件查询学生信息
    * */
    @Test
    public void findById() throws IOException {
        SqlSession sqlSession =null;
        try{
            sqlSession = SqlSessionUtils3.openSession();
            Student stu = sqlSession.selectOne("xx.findById", 2);
            System.out.println(stu);
            SqlSessionUtils3.commit();
        }catch(Exception e ){
            e.printStackTrace();
            SqlSessionUtils3.rollback();
        }finally{
            SqlSessionUtils3.close();
        }

       /* //读取核心配置信息
        InputStream is = Resources.getResourceAsStream("mybatis.xml");
        //获取工厂对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //获取sqlSession对象(本质是封装Connection对象)
        SqlSession sqlSession = factory.openSession();
        //执行操作
        Student stu = sqlSession.selectOne("xx.findById", 3);
        System.out.println(stu);
        //释放资源本质是归还Connection对象
        sqlSession.close();*/
    }

    /*
    * 添加学生信息
    * */
    @Test
    public void insertStu() throws IOException {
        SqlSession sqlSession =null;
        try{
            sqlSession = SqlSessionUtils3.openSession();
            Student stu = new Student(21, "星骸", 22, new Date());
            int count = sqlSession.insert("xx.insertStu", stu);
            System.out.println(count);
            SqlSessionUtils3.commit();
        }catch(Exception e){
            e.printStackTrace();
            SqlSessionUtils3.rollback();
        }finally{
            SqlSessionUtils3.close();
        }

       /* SqlSession sqlSession =null;

        try{
            //读取核心配置文件（内部会同步解析映射文件）
            //InputStream is = Test.class.getClassLoader().getResourceAsStream("mybatis.xml");
            //框架内简化了这一步的操作
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            //获取工厂对象
            //构建者设计模式，封装复杂对象的构建过程，让使用者可以跟家方便简介的获取到需要的目标对象
            //***这个对象最好在方法的局部位置，这个方法一旦执行结束，这个对象就不再需要了
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            //获取sqlSession对象(本质是封装Connection对象)
            //***SqlsessionFactory要保证整个应用中唯一不要重复创建，可以通过单例设计模式或静态成员方式的方式保证
            //***SqlSession不能实现线程共享的，每次使用，都要单独获取，使用完之后，一定记得调用close方法，实现归还
            sqlSession = factory.openSession();
            //执行查询操作
            //List<Student> list = sqlSession.selectList("xx.findAll");
            Student stu1 = new Student(7,"abc",22,new Date());
            int count = sqlSession.insert("xx.addStu", stu1);
            System.out.println(count);
            sqlSession.commit();
        }catch(Exception e){
            sqlSession.rollback();
        }finally{
            //释放资源本质是归还Connection对象
            sqlSession.close();
        }*/
    }


    /*
    * 修改学生的信息
    * */
    @Test
    public void updateStu() throws IOException {
        SqlSession sqlSession =null;
        try{
            sqlSession = SqlSessionUtils3.openSession();
            Student stu = new Student(6, "星空", 24, new Date());
            int update = sqlSession.update("xx.updateStu", stu);
            System.out.println(update);
            SqlSessionUtils3.commit();
        }catch(Exception e){
            SqlSessionUtils3.rollback();
            e.printStackTrace();
        }finally{
            SqlSessionUtils3.close();
        }




       /* SqlSession sqlSession =null;
        try{
            //读取配置文件
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            //获取工厂对象调用build（）方法
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            //获取SqlSession对象（本质是封装Connection对象）
            sqlSession = factory.openSession();
            //执行sql
            Student stu1 = new Student(1, "熙", 23, new Date());
            int update = sqlSession.update("xx.updateStu",stu1);
            System.out.println(update);
            sqlSession.commit();
        }catch (Exception e){
            sqlSession.rollback();
        }finally {
            //归还Connection对象
            sqlSession.close();
        }*/
    }

    /*
     * 删除学生信息
     * */
    @Test
    public void deleteStu() throws IOException {
        SqlSession sqlSession =null;
        try{
            sqlSession = SqlSessionUtils3.openSession();
            int delete = sqlSession.delete("xx.deleteStu",4);
            System.out.println(delete);
            SqlSessionUtils3.commit();
        }catch(Exception e){
            e.printStackTrace();
            SqlSessionUtils3.rollback();
        }finally {
            SqlSessionUtils3.close();
        }

       /* SqlSession sqlSession =null;
        try{
            //读取核心配置文件（内部会同步解析映射文件）
            //InputStream is = Test.class.getClassLoader().getResourceAsStream("mybatis.xml");
            //框架内简化了这一步的操作
            InputStream is = Resources.getResourceAsStream("mybatis.xml");
            //获取工厂对象
            //构建者设计模式，封装复杂对象的构建过程，让使用者可以跟家方便简介的获取到需要的目标对象
            //***这个对象最好在方法的局部位置，这个方法一旦执行结束，这个对象就不再需要了
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            //获取sqlSession对象(本质是封装Connection对象)
            //***SqlsessionFactory要保证整个应用中唯一不要重复创建，可以通过单例设计模式或静态成员方式的方式保证
            //***SqlSession不能实现线程共享的，每次使用，都要单独获取，使用完之后，一定记得调用close方法，实现归还
            sqlSession = factory.openSession();
            //执行查询操作
//        List<Student> list = sqlSession.selectList("xx.findAll");
//        Student stu1 = new Student(7,"abc",22,new Date());
//        int count = sqlSession.insert("xx.deleteStu", stu1);
            int delete = sqlSession.delete("xx.deleteStu", 7);
            System.out.println(delete);
            sqlSession.commit();
        }catch(Exception e){
            sqlSession.rollback();
        }finally{
            //归还Connection对象
            sqlSession.close();
        }*/
    }
}
